#include "cpu/exec/template-start.h"

#define instr call

make_helper(concat(call_i_, SUFFIX)) {
    int len = concat(decode_i_, SUFFIX)(eip + 1); //解码函数名，计算指令长度
    reg_l(R_ESP) =  reg_l(R_ESP) - DATA_BYTE; //模拟栈指针

    MEM_W(reg_l(R_ESP), cpu.eip + len + 1, R_SS); //将下一条指令的地址写入栈（返回地址）
    cpu.eip += (DATA_TYPE_S)op_src->val; //更新指令指针eip，使其指向被调用函数的地址

    print_asm("call: 0x%x", cpu.eip + len + 1); //打印信息

    return len + 1;
} // 处理立即数

make_helper(concat(call_rm_, SUFFIX)) {
	int len = concat(decode_rm_, SUFFIX)(eip + 1);
	reg_l(R_ESP) =  reg_l(R_ESP) - DATA_BYTE;

	MEM_W(reg_l(R_ESP), cpu.eip + len + 1, R_SS);
	cpu.eip = (DATA_TYPE_S)op_src->val - len - 1;

	print_asm("call: %s", op_src->str);

	return len + 1;
} //处理寄存器或内存地址

#include "cpu/exec/template-end.h"